"""命令基类模块"""

import argparse
from abc import ABC, abstractmethod
from typing import Dict, List, Optional, Tuple

class Command(ABC):
    """命令基类

    所有CLI命令都应该继承此类，并实现必要的方法。
    此类只定义命令的基本接口，不包含具体实现逻辑。
    具体的参数处理、文件处理等功能应该通过组合其他工具类来实现。
    """

    name = ""  # 命令名称
    group = "" # 命令分组

    @abstractmethod
    def add_arguments(self, parser: argparse.ArgumentParser) -> None:
        """添加命令参数

        Args:
            parser: 参数解析器
        """
        pass

    @abstractmethod
    def execute(self, args: argparse.Namespace) -> None:
        """执行命令

        Args:
            args: 解析后的参数
        """
        pass

    @abstractmethod
    def get_help(self) -> Tuple[str, str]:
        """获取帮助信息

        返回: (简短说明, 详细说明)
        """
        pass

    def pre_execute(self, args: argparse.Namespace) -> None:
        """命令执行前的处理

        Args:
            args: 解析后的参数
        """
        pass

    def post_execute(self, args: argparse.Namespace) -> None:
        """命令执行后的处理

        Args:
            args: 解析后的参数
        """
        pass

class CommandRegistry:
    """命令注册表"""

    def __init__(self):
        self._commands: Dict[str, Command] = {}
        self._groups: Dict[str, List[Command]] = {}

    def register(self, command: Command) -> None:
        """注册命令"""
        if not command.name:
            raise ValueError("命令名称不能为空")

        if command.name in self._commands:
            raise ValueError(f"命令已存在: {command.name}")

        self._commands[command.name] = command

        # 添加到分组
        if command.group:
            if command.group not in self._groups:
                self._groups[command.group] = []
            self._groups[command.group].append(command)

    def get_command(self, name: str) -> Command:
        """获取命令"""
        return self._commands.get(name)

    def get_groups(self) -> Dict[str, List[Command]]:
        """获取所有分组"""
        return self._groups